// 把exception当成log用

#ifndef __SG_PCL_EXCEPTION_H__
#define __SG_PCL_EXCEPTION_H__

#include <exception>
#include <sstream>
#include <string>

class SGException : public std::exception
{
public:
  SGException(const std::string& strContent) throw(); //构造函数
  // SGException(const exception&) throw() ;                           //拷贝构造函数
  // SGException& operator=(const SGException&) throw() = default; //运算符重载
  virtual ~SGException() throw() = default; //虚析构函数
  virtual const char* what() const throw(); //虚函数

private:
  std::string m_strContent; // 错误内容
};

/// <summary>
/// 异常宏辅助函数，打印错误地点、任务和理由
/// </summary>
/// <param name="location">错误地点，包括文件和行数</param>
/// <param name="task">出错任务（函数名）</param>
/// <param name="reason">出错原因</param>
void sg_exception(const std::string& location, const std::string& task, const std::string& reason);

/// <summary>
/// 异常宏辅助函数，收集文件、行数、函数信息
/// </summary>
/// <param name="file">出错文件名</param>
/// <param name="line">出错行号</param>
/// <param name="function">出错函数</param>
/// <param name="reason">出错原因</param>
void _sg_exception(const std::string& file, const unsigned long& line, const std::string& function,
  const std::string& reason);

// 异常抛出宏，报告文件、函数和行号
#define SG_PANIC(str)                                                                              \
  do                                                                                               \
  {                                                                                                \
    _sg_exception(__FILE__, __LINE__, __FUNCTION__, (str));                                        \
  } while (false)

// 函数未实现宏，报告文件、函数和行号
#define SG_NOT_IMPLEMENTED()                                                                       \
  do                                                                                               \
  {                                                                                                \
    _sg_exception(__FILE__, __LINE__, __FUNCTION__, "该函数还未实现（not implemented yet）！");    \
  } while (false)
#endif // __SG_PCL_EXCEPTION_H__
